package com.djl.rs.controller;

import com.djl.rs.mapper.StaffMapper;
import com.djl.rs.model.Staff;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;


/** 处理用户相关请求的控制器类 */
@RestController
@RequestMapping("staff")
public class StaffController  {
    @Autowired
    private StaffMapper staffMapper;

    @RequestMapping("getAllStaff")
    public List<Staff> getAllStaff() {
        List<Staff> data=staffMapper.findList();
        System.out.println(data);
        return data;
    }

    @RequestMapping("findByName")
    public Staff findByName(String name) {
        Staff data=staffMapper.findByName(name);
        System.out.println(data);
        return data;
    }
    @RequestMapping("deleteStaff")
    public Integer deleteStaff(Integer sid) {
        Integer data=staffMapper.delete(sid);
        System.out.println(data);
        return data;
    }

    /*
    * 文件上传与实体类Staff中的变量photo如何联系起来是非常巧妙的
    * 这里获取前端传来的文件的name是file，并不是实体类中的photo
    * 核心：name不一样这样就不会把文件的流保存到实体类的photo中，但是矛盾的就是实体类的photo类型是string的，并不是MultipartFile类型
    * 所以实体类的photo接收不到前端的数据，所以把name设置不一样
    * 这样就可单独接收文件数据，等处理完文件数据，再把文件名赋值给实体类中的photo就可以了
    * 巧妙的完成了文本和文件数据一起上传
    * */
    @RequestMapping("addStaff")
    public Integer addStaff(Staff staff, @RequestParam("file")MultipartFile file, HttpSession session) {
        /*
        * 处理文件
        * */
        // 判断上传的文件是否为空
        if (file.isEmpty()) {
            // 是：设置文件名为空
             staff.setPhoto("");
        }
        else{
            // 获取当前项目的绝对磁盘路径
            String parent = session.getServletContext().getRealPath("/upload");
            System.out.println(parent);

            // 保存头像文件的文件夹
            File dir = new File(parent);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // 保存的头像文件的文件名
            String suffix = "";
            String originalFilename = file.getOriginalFilename();//获取文件名
            int beginIndex = originalFilename.lastIndexOf(".");
            if (beginIndex > 0) {
                suffix = originalFilename.substring(beginIndex);
            }
            String filename = UUID.randomUUID().toString() + suffix;//生成唯一标识码，防止文件名重复
            staff.setPhoto(filename);//把文件名保存到实体类中

            // 创建文件对象，表示保存的头像文件
            File dest = new File(dir, filename);
            // 执行保存头像文件
            try {
                file.transferTo(dest);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return staffMapper.insert(staff);
    }


    @RequestMapping("updateStaff")
    public Integer updateStaff(Staff staff, @RequestParam("file")MultipartFile file, HttpSession session) {
        System.out.println(staff);
        /*
         * 处理文件
         * */
        // 判断上传的文件是否为空
        if (file.isEmpty()) {
            // 是：设置文件名为空
            staff.setPhoto("");
        }
        else{
            // 获取当前项目的绝对磁盘路径
            String parent = session.getServletContext().getRealPath("/upload");
            System.out.println(parent);

            // 保存头像文件的文件夹
            File dir = new File(parent);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // 保存的头像文件的文件名
            String suffix = "";
            String originalFilename = file.getOriginalFilename();//获取文件名
            int beginIndex = originalFilename.lastIndexOf(".");
            if (beginIndex > 0) {
                suffix = originalFilename.substring(beginIndex);
            }
            String filename = UUID.randomUUID().toString() + suffix;//生成唯一标识码，防止文件名重复
            staff.setPhoto(filename);//把文件名保存到实体类中

            // 创建文件对象，表示保存的头像文件
            File dest = new File(dir, filename);
            // 执行保存头像文件
            try {
                file.transferTo(dest);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return staffMapper.updateInfoBySid(staff);
    }
}
